package com.tangruojie.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * ServletContainersInitConfig 初始化类的存在代替 web.xml 实现基于代码的 Servlet 注册与 Spring 配置加载。
 * ✅ 将 DispatcherServlet 交给 Servlet 容器（Tomcat/Jetty）管理；
 * ✅ 并在 DispatcherServlet 内部，创建并初始化 SpringMVC 的子容器来管理 Web 层的 Bean。
 * ----------
 * org.springframework.web.servlet.support.AbstractDispatcherServletInitializer该抽象类是 Spring 提供的简化 Servlet 3.0+ 编程模型，用于自动注册 DispatcherServlet。
 */
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    /**
     * 创建 SpringMVC 的 IOC 容器（子容器）；
     * 注册 SpringMvcConfig，即 SpringMVC 的配置类；
     * 这个容器专门用于 MVC 相关的 Bean，如 @Controller、ViewResolver、HandlerMapping。
     *
     * @return
     */
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(SpringMvcConfig.class);
        return context;
    }

    /**
     * 指定由 DispatcherServlet 处理的请求路径；
     * "/" 表示拦截所有请求（包括静态资源，但需配置静态资源映射）；
     * 等价于 web.xml 中：
     * <servlet-mapping>
     *      <servlet-name>dispatcher</servlet-name>
     *      <url-pattern>/</url-pattern>
     * </servlet-mapping>
     *
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    /**
     * 设置 Spring 的根容器（父容器）；
     * 如果你需要在项目中使用 @Service、@Repository、数据源、事务等非 MVC Bean，可以在这里加载一个配置类，比如 AppConfig.class；
     * 当前返回 null 表示没有使用父容器。
     *
     * @return
     */
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}
/**
 * ✅ Servlet 容器（如 Tomcat）管理 DispatcherServlet（即注册为一个标准 Servlet）；
 * ✅ DispatcherServlet 内部持有一个 Spring MVC 的子容器（WebApplicationContext），专门用于管理 @Controller、视图解析器、拦截器等；
 * ✅ 当请求进来，Servlet 容器调用 DispatcherServlet，DispatcherServlet 再从自己的容器里调度合适的 Controller Bean 来处理请求。
 * [TOMCAT (Servlet容器)]
 *         │
 *         ├── 注册 DispatcherServlet（由 ServletContainersInitConfig 完成）
 *         │       │
 *         │       └── DispatcherServlet.init()
 *         │               └── 创建 SpringMVC WebApplicationContext（子容器）
 *         │                       └── 管理所有 SpringMVC Bean（@Controller, @RequestMapping...）
 *         │
 *         └── 用户请求 /save → DispatcherServlet → 调用 Controller → 返回结果
 */
